/**
 * 两个人各有若干个1和若干个2，各自等概率的抽一个数pk。
 * 小的一方数被去掉，大的放回，平局都放回。
 * 当然一方没有数以后，或者必然平局时游戏结束。
 * 问步数的期望。
 * 令 D[r2][r1][z2][z1] 是R有r2个2、r1个1，Z有z2个2、z1个1的期望
 * 则期望公式是
 *                        r1           z2
 * D[r2][r1][z2][z1] = --------- * --------- * D[r2][r1-1][z2][z1] 
 *                      r1 + r2     z1 + z2
 *                        r2          z1 
 *                   + --------- * --------- * D[r2][r1][z2][z1-1]
 *                      r1 + r2     z1 + z2
 *                   + 剩下的概率 * D[r2][r1][z2][z1] + 1
 * 由此可以求出 D[r2][r1][z2][z1] 的表达。
 * 初始化是 D[i][0][i][0] = D[0][i][0][i] = 0
 * 注意边界条件
 * O(N^4)
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;

llt const MOD = 1E9 + 7LL;

llt qpow(llt a, llt n){
	llt r = 1;
	while(n){
		if(n & 1) r = r * a % MOD;
		a = a * a % MOD;
		n >>= 1;
	}
	return r;
}

llt inv(llt a){return qpow(a, MOD-2LL);}

int N, M;
vi A, B;
vector<vector<vector<vector<llt>>>> D;


llt dp(int r2, int r1, int z2, int z1){
	if(-1 != D[r2][r1][z2][z1]) return D[r2][r1][z2][z1];

    llt rr1 = r1 * inv(r2 + r1) % MOD;
	llt rr2 = r2 * inv(r2 + r1) % MOD;
	llt zz1 = z1 * inv(z2 + z1) % MOD;
	llt zz2 = z2 * inv(z2 + z1) % MOD;

	llt ans = 0;
	if(z2 > 0 and r1 > 0){
		ans = (ans + zz2 * rr1 % MOD * (dp(r2, r1 - 1, z2, z1) + 1) % MOD);
	}
	if(r2 > 0 and z1 > 0){
		ans = (ans + zz1 * rr2 % MOD * (dp(r2, r1, z2, z1 - 1) + 1) % MOD) % MOD;
	}
	ans = (ans + zz1 * rr1 % MOD + zz2 * rr2 % MOD) % MOD;

	llt fenmu = 1 - (zz1 * rr1 % MOD + zz2 * rr2 % MOD) % MOD;
	fenmu %= MOD;
	if(fenmu < 0) fenmu += MOD;
	ans = ans * inv(fenmu) % MOD;
	return D[r2][r1][z2][z1] = ans;
}

llt proc(){
	int c[2] = {0};
	for(auto i : A) ++c[i&1];

	int cc[2] = {0};
	for(auto i : B) ++cc[i&1];

    D.assign(
		c[0] + 1, 
		vector<vector<vector<llt>>>(
			c[1] + 1,
			vector<vector<llt>>(
				cc[0] + 1,
				vector<llt>(cc[1] + 1, -1LL)
			)
		)
	);

	for(int i=0;i<=min(c[0], cc[0]);++i) D[i][0][i][0] = 0;
	for(int i=0;i<=min(c[1], cc[1]);++i) D[0][i][0][i] = 0;

	return dp(c[0], c[1], cc[0], cc[1]);
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    cin >> N >> M;
	A.assign(N, {}); B.assign(M, {});
	for(auto & i : A) cin >> i;
	for(auto & i : B) cin >> i;
	cout << proc() << endl;
    return 0;
}
